/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package tesis.service.impl;

import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import javax.inject.Inject;
import javax.persistence.Query;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import tesis.common.utils.CollectionsUtil;
import tesis.domain.*;
import tesis.domain.dto.UsuarioDTO;
import tesis.service.CrudService;
import tesis.service.UsuarioService;
import tesis.utils.Constantes;
import tesis.utils.TesisStringUtils;

/**
 *
 * @author hugo
 */
@Transactional
@Service("usuarioService")
public class UsuarioServiceImpl implements UsuarioService{
    private final static Logger LOG=LoggerFactory.getLogger(UsuarioServiceImpl.class);
    @Inject
    private CrudService crud;
    
    
    @Override
    public List<UsuarioDTO> find(UsuarioDTO filtro) {
        List<UsuarioDTO> lstUsuarios=new ArrayList<UsuarioDTO>();
        List<Usuario>results=null;
        Query query=null;
        try{
            LOG.info("buscando usuarios");
            query=construirFindQuery(filtro,false);
            results=query.getResultList();
            if (!CollectionsUtil.isEmpty(results)){
                for(Usuario c:results){
                    lstUsuarios.add(new UsuarioDTO(c));
                }
            }
            LOG.info("lista obtenida con éxito, tam: "+lstUsuarios.size());
        }catch(RuntimeException ex){
            LOG.error("Error al obtener usuarios",ex);
            throw ex;
        }
        return lstUsuarios;
         
    }

      private Query construirFindQuery(UsuarioDTO filtro, boolean contar){
        Query query=null;
        StringBuilder sb=new StringBuilder();
        
        try{
            if (!contar){
                sb.append("SELECT c ");
            }else{
                sb.append("SELECT count(c) ");
            }

            sb.append(" FROM Usuario c where UPPER(c.esactivo) != 'E' ");

            if (TesisStringUtils.conValor(filtro.getNombre())){
                sb.append(" AND UPPER(c.nombre) like :nombre ");
            }
            if(TesisStringUtils.conValor(filtro.getApellidopaterno())){
                sb.append(" AND UPPER(c.apellidopaterno) like :apellidopaterno ");
            }
            if(TesisStringUtils.conValor(filtro.getApellidomaterno())){
                sb.append(" AND UPPER(c.apellidomaterno) like :apellidomaterno ");
            }

            if(!contar){
                sb.append(" ORDER BY c.nombre asc ");
            }

            query=crud.getEm().createQuery(sb.toString());
            if (TesisStringUtils.conValor(filtro.getNombre())){
                query.setParameter("nombre", "%"+filtro.getNombre().trim().toUpperCase()+"%");
            }
                if (TesisStringUtils.conValor(filtro.getApellidopaterno())){
                query.setParameter("apellidopaterno", "%"+filtro.getApellidopaterno().trim().toUpperCase()+"%");

            }
            if (TesisStringUtils.conValor(filtro.getApellidomaterno())){
                query.setParameter("apellidomaterno", "%"+filtro.getApellidomaterno().trim().toUpperCase()+"%");
            }

            if (!contar && filtro.getStartIndex()!=null){
                query.setFirstResult(filtro.getStartIndex());
                query.setMaxResults(filtro.getResults());
            }
            
        }catch(RuntimeException ex){
             LOG.error("Error contar rol",ex);
            throw ex;
        }
        return query;
    }
    
    
    
    @Override
    public UsuarioDTO findById(Integer idUsuario) {
       UsuarioDTO usuarioDTO=new UsuarioDTO();
        Usuario usuario=null;
        try{
            usuario=crud.find(idUsuario, Usuario.class);
            if (usuario!=null){
                usuarioDTO=new UsuarioDTO(usuario);
            }
            LOG.info("Cargo encontrado con éxito");
        }catch(RuntimeException ex){
            LOG.error("Error al buscar cargo: "+ex);
            throw ex;
        }
        return usuarioDTO;
    }
    
    public Usuario grabar(Usuario usuario){
          
        Usuario original=null;
        try{
            LOG.info("grabando usuario");
            if (usuario.getIdusuario()==null){
               usuario=crud.create(usuario);               
            }else{
                original=crud.find(usuario.getIdusuario(), Usuario.class);
                if(usuario.getUsuario()!= null) original.setUsuario(usuario.getUsuario());
                if(usuario.getNombre() != null) original.setNombre(usuario.getNombre());
                if(usuario.getApellidopaterno() != null) original.setApellidopaterno(usuario.getApellidopaterno());
                if(usuario.getApellidomaterno() != null) original.setApellidomaterno(usuario.getApellidomaterno());
                if(usuario. getCelular() != null) original.setCelular(usuario.getCelular());
                if(usuario.getEmail() != null ) original.setEmail(usuario.getEmail());   
                if(usuario.getPassword() != null) original.setPassword( usuario.getPassword());
                if(usuario.getTelefono() != null) original.setTelefono(usuario.getTelefono());
                if(usuario.getAnexo()!= null) original.setAnexo(usuario.getAnexo());
                original.setEsactivo(usuario.getEsactivo());
                usuario=crud.update(original);                
            }
            LOG.info("Registro correcto");
        }catch(RuntimeException ex){
            LOG.error("Error al registrar cargo: "+ex);
            throw ex;
        }
       
        return usuario;
    
    }
    
    
    public boolean eliminar(UsuarioDTO usuarioDTO){
          
        Usuario original=null;
    
        try{
            LOG.info("grabando usuario");
            if (usuarioDTO.getIdusuario()!=null){
               
               original=crud.find(usuarioDTO.getIdusuario(), Usuario.class); 
               original.setEsactivo('E');
               crud.update(original);
            }
            LOG.info("usuario modificado con éxito: "+original.getIdusuario());
        }catch(RuntimeException ex){
            LOG.error("Error al registrar usuario: "+ex);
            throw ex;
        }
        return true;
    
    }
    
    @Override
    public Integer cantidadUsuarios(UsuarioDTO filtro) {
        try{
            LOG.info("contando cargos");
           return ((Long)construirFindQuery(filtro,true).getSingleResult()).intValue();
            
        }catch(RuntimeException ex){
            LOG.error("Error contar cargos",ex);
            throw ex;
        }
        
    }
    
}
